package com.cloud.utils;

import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.cloud.common.constants.GlobalConstants;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;

/**
 * HuTool 工具类
 *
 * @author yzj
 */
public class ToolUtils {

    /**
     * 请求头/内容编码
     *
     * @param str 内容
     * @return 编码后的内容
     */
    public static String httpEncode(String str) {
        try {
            return URLEncoder.encode(str, GlobalConstants.UTF_8);
        } catch (UnsupportedEncodingException e) {
            return "";
        }
    }

    /**
     * 请求头/内容解码
     *
     * @param str 内容
     * @return 解码后的内容
     */
    public static String httpDecoder(String str) {
        try {
            return URLDecoder.decode(str, GlobalConstants.UTF_8);
        } catch (UnsupportedEncodingException e) {
            return "";
        }
    }

    /**
     * 对象转换
     *
     * @param obj
     * @param <T>
     * @return
     */
    public static <T> T strongTurn(Object obj) {
        return (T) obj;
    }

    /**
     * 字符串ids 去重并转换List<Long>
     *
     * @return
     */
    public static List<Long> setIdsToList(String strIds) {
        Set<Long> idSet = Convert.toSet(Long.class, strIds);
        return new ArrayList<>(idSet);
    }

    /**
     * 字符串Str 去重并转换List<Integer>
     *
     * @return
     */
    public static List<Integer> setStrToIntList(String strIds) {
        Set<Integer> strSet = Convert.toSet(Integer.class, strIds);
        return new ArrayList<>(strSet);
    }

    /**
     * 字符串Str 去重并转换List<String>
     *
     * @return
     */
    public static List<String> setIdsToStrList(String strIds) {
        Set<String> idSet = Convert.toSet(String.class, strIds);
        return new ArrayList<>(idSet);
    }


    /**
     * 字符串Str 去重并转换List<String>
     *
     * @return
     */
    public static List<String> setStrToList(String str) {
        Set<String> strSet = Convert.toSet(String.class, str);
        return new ArrayList<>(strSet);
    }

    /**
     * 转化JSON 中时间戳格式日期
     *
     * @param object
     * @return
     */
    public static String jsonTimeStamp(Object object) {
        return JSONObject.toJSONStringWithDateFormat(object, "yyyy-MM-dd HH:mm:ss");
    }

    /**
     * 时间格式化,T
     *
     * @param dateTime
     * @return
     */
    public static String setFormatTDateTime(String dateTime) {
        DateTimeFormatter dateTimeFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss", Locale.US);
        LocalDateTime localDate = LocalDateTime.parse(dateTime, dateTimeFormat);
        return DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(localDate);
    }

    /**
     * 获取当前时间
     * 格式:yyyy-MM-dd HH:mm:ss
     *
     * @return
     */
    public static String getNow() {
        return DateUtil.now();
    }

    /**
     * 获取当前日期
     * 格式:yyyy-MM-dd
     *
     * @return
     */
    public static String toDay() {
        return DateUtil.today();
    }

    /**
     * 获取带下划线时间格式名称
     *
     * @return
     */
    public static String getDataNameFormat() {
        return DateUtil.format(new Date(), "yyyy_MM_dd_HH_mm");
    }

    /**
     * 获取时间格式路径
     *
     * @return
     */
    public static String getDataUrlFormat() {
        return DateUtil.format(new Date(), "yyyy/MM/dd");
    }

    /**
     * 获取不带不带'-'的字符串
     *
     * @return
     */
    public static String getUuid() {
        return IdUtil.simpleUUID();
    }

    /**
     * 设置模板文本替换参数
     *
     * @param template 文本模板 例子:xxx{name}xxx
     * @param data
     * @return
     */
    public static String setTextTemplate(String template, Map<String, Object> data) {
        return StrUtil.format(template, data);
    }

    /**
     * 检验字符串是否为浮点型
     *
     * @param value
     * @return
     */
    public static boolean verifyDouble(String value) {
        if (StringUtils.isEmpty(value)) {
            return false;
        } else {
            return NumberUtil.isDouble(value);
        }
    }

    /**
     * 计算数值百分比
     *
     * @param n1 被除数
     * @param n2 除数
     * @return
     */
    public static double getNumPercent(float n1, float n2) {
        double remNum = NumberUtil.div(n1, n2);
        // 获取数值百分比
        String numFormat = NumberUtil.decimalFormat("#.##%", remNum);
        // 保留2位小数
        return Double.parseDouble(NumberUtil.roundStr(numFormat, 2));
    }

    /**
     * 截取并校验字符串,不存在返回null
     *
     * @param str
     * @param separator 分割符
     * @param checkStr  校验字符串
     * @return
     */
    public static boolean checkSplitStr(String str, String separator, String checkStr) {
        // 去除切分字符串后每个元素两边的空格,否忽略空串
        List<String> strList = StrUtil.split(str, separator, true, true);
        String strSub1 = strList.get(0);
        if (checkStr.equalsIgnoreCase(strSub1)) {
            return true;
        }
        return false;
    }

    /**
     * 校验对象是否存在某个字段
     *
     * @return
     */
    public static boolean checkFields(JSONObject json, String field) {
        if (StringUtils.isEmpty(json)) {
            return false;
        }
        return json.containsKey(field);
    }

}
